/*
 * @Description: 移动零
 * @FilePath: \算法\字符串\283.移动零.js
 */ 
/*
 * @lc app=leetcode.cn id=283 lang=javascript
 *
 * [283] 移动零
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */

/*  方法一

    1. 遍历所有的数据，找到非零元素
    2. 填充非零元素，后面覆盖为0

    时间复杂度: O(n)
    空间复杂度：O(n)

*/ 
var moveZeroes1 = function(nums) {
    let nums = [];   // 保存非零元素

    for(let i = 0; i < nums.length; i++) {
        if(nums[i] !== 0) 
            nums.push(nums[i])
    }
    for(let i = 0; i < nums.length; i++) 
        nums[i] = nums[i]
    for(let i = nums.length; i < nums.length; i++) 
        nums[i] = 0

    return nums;
};


/*  方法二: 

    1. 定义两个指针l(标记当前可以存储的非0索引), r(标记当前所指向的元素)
    2. 如果r所指元素为非零，交换l和r所指向的元素，同时l++, r++
    3. 否则 r向前遍历 结束在 r < len

    时间复杂度: O(n)
    空间复杂度：O(1)

*/ 
var moveZeroes = function(nums) {
    let l = 0,  // 标记下一个非零元素的位置
        r = 0;      // 指向当前的遍历到的元素

    while(r < nums.length) {
        if(nums[r] != 0) {
            let temp = nums[r];
            nums[r] = nums[l];
            nums[l] = temp;
            l++;
        }
        r++;
    }

    return nums;
};
let res = moveZeroes([1]);
console.log(res);
// @lc code=end

